/******************************************************************************* * Copyright (C) 2015 Connor Lanigan (email: dev@connorlanigan.com) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. *******************************************************************************/ package de.norvos.gui.components; import static de.norvos.i18n.Translations.translate; import java.io.File; import java.io.IOException; import java.net.URL; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import de.norvos.contacts.Contact; import de.norvos.contacts.ContactService; import de.norvos.eventbus.Event; import de.norvos.eventbus.EventBusListener; import de.norvos.eventbus.events.MessageReceivedEvent; import de.norvos.eventbus.events.MessageSentEvent; import de.norvos.messages.DecryptedMessage; import de.norvos.messages.MessageService; import de.norvos.utils.Constants; import de.norvos.utils.ResourceUtils; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; import javafx.scene.control.CheckBox; import javafx.scene.control.TextArea; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyEvent; import javafx.scene.layout.BorderPane; import javafx.scene.layout.VBox; import javafx.scene.paint.Paint; import javafx.scene.text.Text; /** * The GUI area containg the messages for a contact. * * @author Connor Lanigan */ public class MessageList extends BorderPane implements EventBusListener { private static MessageList activeInstance; final static Logger LOGGER = LoggerFactory.getLogger(MessageList.class); private static final String unverifiedColor = "#FF0000"; private static final String verifiedColor = "#06f50a"; public static MessageList getActiveInstance() { return activeInstance; } private Contact contact; @FXML private TextArea messageInput; @FXML private VBox messageList; private boolean shiftHeld; @FXML private Text usernameDisplay; @FXML private CheckBox verified; public MessageList() { shiftHeld = false; final FXMLLoader fxmlLoader = new FXMLLoader(); final URL fxml = getClass().getResource(Constants.FXML_LOCATION + "MessageList.fxml"); fxmlLoader.setRoot(this); fxmlLoader.setController(this); fxmlLoader.setResources(ResourceUtils.getLocalizedStringsBundle()); try { fxmlLoader.load(fxml.openStream()); activeInstance = this; } catch (final IOException exception) { throw new RuntimeException(exception); } } private void addMessage(final String message, final long timestamp, final File attachment, final boolean sent, final long messageId) { final SingleMessage singleMessage = new SingleMessage(); singleMessage.setMessage(message); singleMessage.setSent(String.valueOf(sent)); singleMessage.setTime(timestamp); singleMessage.setMessageId(messageId); messageList.getChildren().add(singleMessage); } public void focusInput() { messageInput.requestFocus(); messageInput.positionCaret(messageInput.getText().length()); } public Contact getContact() { return contact; } public String getUser() { return contact.getPhoneNumber(); } public void initialize() { // TODO get verified status setVerified(false); } public void keyPressed(final KeyEvent event) { if (event.getCode() == KeyCode.SHIFT) { LOGGER.debug("shift held"); shiftHeld = true; } else if (event.getCode() == KeyCode.ENTER) { if (shiftHeld) { messageInput.setText(messageInput.getText() + "\n"); messageInput.positionCaret(messageInput.getText().length()); LOGGER.debug("New text length: {}", messageInput.getText().length() - 1); } else { final String message = messageInput.getText().trim(); messageInput.setText(""); sendMessage(message); } contact.setDraftMessage(messageInput.getText()); } } public void keyReleased(final KeyEvent event) { if (event.getCode() == KeyCode.SHIFT) { LOGGER.debug("shift released"); shiftHeld = false; } else if (!shiftHeld && event.getCode() == KeyCode.ENTER) { messageInput.clear(); } else { contact.setDraftMessage(messageInput.getText()); } } public void removeMessage(final SingleMessage message) { messageList.getChildren().remove(message); } public void sendMessage(final String message) { MessageService.getInstance().sendMessage(ContactService.getInstance().getByNumber("+491788174362"), message); } public void setUser(final Contact user) { contact = user; usernameDisplay.setText(contact.getDisplayName()); messageInput.setText(contact.getDraftMessage()); final List<DecryptedMessage> list = MessageService.getInstance().getMessages(contact); for (final DecryptedMessage message : list) { addMessage(message.getBody(), message.getTimestamp(), message.getAttachment(), message.isSent(), message.getMessageId()); } } public void setUser(final String user) { setUser(ContactService.getInstance().getByNumber(user)); } private void setVerified(final boolean value) { verified.setSelected(value); // TODO change color if (value) { verified.setText(translate("verified_label")); verified.setTextFill(Paint.valueOf(verifiedColor)); } else { verified.setText(translate("not_verified_label")); verified.setTextFill(Paint.valueOf(unverifiedColor)); } } @Override public void update(final Event event) { if (event instanceof MessageSentEvent) { final MessageSentEvent messageSentEvent = (MessageSentEvent) event; if (getContact().equals(messageSentEvent.getContact())) { addMessage(messageSentEvent.getMessage(), messageSentEvent.getTimestamp(), messageSentEvent.getAttachment(), true, messageSentEvent.getMessageId()); } } else if (event instanceof MessageReceivedEvent) { final MessageReceivedEvent messageReceivedEvent = (MessageReceivedEvent) event; final DecryptedMessage message = messageReceivedEvent.getMessage(); if (getContact().equals(message.getContact())) { addMessage(message.getBody(), message.getTimestamp(), message.getAttachment(), false, -1); } } } }